package com.powernode.listener;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.powernode.constant.Constants;
import com.powernode.entity.Goods;
import com.powernode.entity.Orders;
import com.powernode.service.GoodsService;
import com.powernode.service.OrdersService;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Date;

/**
 * 订单 延时队列 消费者 监听器
 * 监听 订单是否支付
 */
@Component
@Slf4j
public class OrderDelayListener {

    @Resource
    private OrdersService ordersService;

    @Resource
    private GoodsService goodsService;

    // 定义消费者
    @RabbitListener(queues = Constants.QUEUE_DELAY_NAME)
    public void handlerDelayMsg(Message message, Channel channel) {
        log.info("超时未支付功能 -- 延时消息接收成功 , 当前时间为 : {} -- 消费者 延时队列监听器 -- 更加订单id查询订单状态判断用户是否支付订单", new Date());
        // 获取订单id
        byte[] body = message.getBody();
        String msg = new String(body);
        Integer orderId = Integer.valueOf(msg);
        // 查询订单数据
        Orders orders = ordersService.getById(orderId);
        // 判断订单状态
        // TODO : 这里的功能是不是没有健全 : 当未支付的时候 , 不应该删除订单吗 ?
        if (orders.getStatus() == 0) {
            // 并且表的数量回增
            boolean update1 = goodsService.update(new UpdateWrapper<Goods>().setSql("store = store + 1").eq("id", orders.getGoodsId()));

            // 设置状态为 未支付 , 并修改更新时间
            boolean update = ordersService.update(new LambdaUpdateWrapper<Orders>()
                    .set(Orders::getStatus, 2)
                    .set(Orders::getUpdateTime, new Date())
                    .eq(Orders::getId, orders.getId()));
        }
        // 手动签收
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
